package sao.controlador;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import sao.dao.Dao;
import sao.modelo.Usuario;

/**
 * Servlet implementation class EfetuarAgendamentoController
 */
public class EfetuarAgendamentoController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		// Verifica autenticação do usuário
		HttpSession sessao = request.getSession(false);
		if (sessao == null) {
			despachaUsuario(request, response, "login.jsp");
		}
		
		// Verifica permissão do usuário
		Usuario usuario = (Usuario) sessao.getAttribute("usuario");
		if (!(usuario.getPerfil().isOperacaoValida("agendarConsultaPropria.do"))) {
			request.setAttribute("mensagemErro", "ERRO: Você não tem permissão para efetuar esta operação!");
			despachaUsuario(request, response, "erro.jsp");
		}
		
		// Recebe a data e hora do agendamento
		String horario = request.getParameter("horario");
		// Testa se a data está no formato válido
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// Usado para testar o formato da data hora
		
		try {
			
			@SuppressWarnings("unused")
			Date dataTeste = sdf.parse(horario);//Usado apenas para levantar exceção em caso de falha
			Dao dao = new Dao();
			int codMedico = Integer.parseInt(getServletContext().getInitParameter("codigoMedico"));
			
			// Testa se este agendamento já foi inserido
			if (dao.getAgendamentoEspecifico(codMedico, usuario.getCodigo(), horario).size() > 0) {
				despachaUsuarioPaginaErro(request, response, 
						"ERRO: Já existe agendamento para esta data/horário"); // Em falha, envia usuário à pág de erro
			}
			
			// Insere o novo agendamento
			int linhas = dao.insertAgendamento(usuario.getCodigo(), codMedico, horario);
			// Testa se o agendamento foi inserido (linhas maior igual a 1)
			if (linhas < 1) {
				despachaUsuarioPaginaErro(request, response, 
						"Falha ao tentar inserir o novo agendamento de consulta!"); // Em falha, envia usuário à pág de erro
			}
			// Caso o agendamento seja feito, seta mensagem de confirmação e envia usuário
			request.setAttribute("mensagemConfirmacao", 
					"Seu agendamento foi efetuado com sucesso para a data/horário: <strong>" 
					+ horario + "</strong>!");
			despachaUsuario(request, response, "confirmacao.jsp");
			
		} catch (ParseException e) {
			e.printStackTrace();
			despachaUsuarioPaginaErro(request, response, e.getMessage());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			despachaUsuarioPaginaErro(request, response, e.getMessage());
		} catch (SQLException e) {
			e.printStackTrace();
			despachaUsuarioPaginaErro(request, response, e.getMessage());
		}
		
	}//FIM método doGet
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}//FIM método doPost
	
	
	/**
	 * Envia o usuário a alguma página, dependendo se sua autenticação
	 * foi ou não aceita
	 * @param request
	 * @param response
	 * @param pagina
	 */
	private void despachaUsuario(HttpServletRequest request,
			HttpServletResponse response, String pagina) {
		RequestDispatcher view = request.getRequestDispatcher(pagina);
		try {
			view.forward(request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}//FIM método despachaUsuario

	
	/**
	 * Envia o usuário a página de erro padrão com alguma mensagem
	 * @param request
	 * @param response
	 * @param mensagemErro - Uma mensagem de erro a ser exibida ao usuário
	 */
	private void despachaUsuarioPaginaErro(HttpServletRequest request,
			HttpServletResponse response, String mensagemErro) {
		request.setAttribute("mensagemErro", mensagemErro);
		RequestDispatcher view = request.getRequestDispatcher("erro.jsp");
		try {
			view.forward(request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}//FIM método despachaUsuario

}
